//e@\荞
#include_function ".\System\ResultSystem.txt"
#include_function ".\System\TitleSystem.txt"
#include_function ".\System\HiScoreSystem.txt"
#include_function ".\System\SpellSystem.txt"
#include_function ".\System\PlayDataSystem.txt"
#include_function ".\System\BackGroundSystem.txt"
#include_function ".\System\UserScoreSystem.txt"
#include_function ".\System\DrawSystem.txt"
#include_function ".\System\ConfigSystem.txt"

/**
 * Q[Jn
 */
task StartGame(){
	//c@ݒ蓙
	ExpertEx( false, 9, 3 );
	
	//Ô1F҂
	yield;
	
	//vCǂf
	if( IsReplay() ){
		isReplayData = true;
	}else{
		isReplayData = false;
	}
	
	//ʃf[^쐬
	CreateOFTCommonData();
	
	//Z[uf[^ǂݍސݒɂȂĂꍇ̂ݓǂݍ
	if( IsLoadFile ){
		//Z[uf[^ǂݍ
		if( !isReplayData ){
			//Z[ut@Cǂݍ
			LoadCommonDataEx( "OFT_Save", SaveFilePath );
		}else{
			//vCt@Cǂݍ
			//TODO:vC̓ǂݍݑΉ
			LoadCommonDataEx( "OFT_Save", SaveFilePath );
			//LoadCommonDataFromReplayFileEx( "OFT_Save" );
			//LoadCommonDataFromReplayFile();
		}
		
		//RtBOf[^ǂݍ
		LoadCommonDataEx( "OFT_Config", ConfigFilePath );
	}
	
	//fނ̓ǂݍ
	LoadMaterial();
	
	//[gVXe
	SetRateScoreSystemEnable( false );
	//ftHgXe[^X
	SetDefaultStatusVisible( false );
	
	//XRAGNXeh^XNN
	ScoreExtend();
	
	//I[o[GNXeh^XNN
	OverExtend();
	
	//XRAlǗ^XNN
	ScorePointControlTask();
	
	//ƎXRAVXeN
	UserScoreTask();
	
	//t[̗vf`^XNN
	FrameDrawTask();
	
	//OCY`[W
	GrazeTask();
	
	//ACe쐬^XNJn
	ItemTask();
	
	//Q[W`^XNJn
	DrawGauge();
	
	//wi^XNJn
	BackGroundControl();
	
	//vCԊǗ^XNN
	PlayTimeTask();
	
	//^CgJn
	Title();
}

/**
 * Q[I
 */
task EndGame(){
	//nCXRA̋L^
	if( State != State_Title ){
		let player = GetCommonDataDefaultEx( "OFT", "Player", "" );
		let difficult = GetCommonDataDefaultEx( "OFT", "Difficult", "" );
		SetHiScore( player, difficult, score1, score2, score3 );
	}
	
	//vCԂ̋L^
	if( IsLoadFile ){
		SavePlayTime();
	}
	
	//ʃf[^̃Z[u
	SaveOFTCommonData();
	
	//ʃf[^̍폜
	DeleteOFTCommonData();
	
	//fނ̍폜
	UnLoadMaterial();
	
	//vCpɃXRẢ̐l𑝂₷
	AddScore( score1 * ( scoreexp / 10 ) + truncate( score2 / 10 ) );
}

/**
 * `揈
 */
function GameDrawLoop(){
	alternative( State )
		case( State_Title ){
			//^Cg
			TitleDraw();
		}
}

/**
 * ʃf[^Ԃ쐬
 */
function CreateOFTCommonData(){
	//ʏGA
	CreateCommonDataArea( "OFT" );
	//ꎞgpGA
	CreateCommonDataArea( "OFT_tmp" );
	//Z[upGA
	CreateCommonDataArea( "OFT_Save" );
	//RtBOpGA
	CreateCommonDataArea( "OFT_Config" );
	
	//vCǂ
	SetCommonDataEx( "OFT", "IsReplay", isReplayData );
	//vC[
	SetCommonDataEx( "OFT", "Player", "" );
	//Փx
	SetCommonDataEx( "OFT", "Difficult", "" );
	//~X
	SetCommonDataEx( "OFT", "MissNum", 0 );
	//{
	SetCommonDataEx( "OFT", "BombNum", 0 );
	//Xy擾
	SetCommonDataEx( "OFT", "GetSpellNum", 0 );
	//V[hQ[W
	SetCommonDataEx( "OFT", "ShieldGauge", ShieldGauge_Max );
	//`[WQ[W
	SetCommonDataEx( "OFT", "ChargeGauge", 0 );
	//݃`[W
	SetCommonDataEx( "OFT", "NowChargeCount", 0 );
	//ő`[W
	SetCommonDataEx( "OFT", "MaxChargeCount", 0 );
	//{GNXehl
	SetCommonDataEx( "OFT", "BombExtendPoint", 0 );
	//{GNXehm}l
	SetCommonDataEx( "OFT", "BombExtendNormaPoint", 0 );
	//{GNXehVOi
	SetCommonDataEx( "OFT", "BombExtendSignal", false );
	//XRAl
	SetCommonDataEx( "OFT", "ScorePoint", 1 );
	//ACetO
	SetCommonDataEx( "OFT", "CollectUserItem", false );
	//ACe쐬pz
	SetCommonDataEx( "OFT", "Item", [] );
	
	//Z[uf[^ǂݍ܂ȂݒɂȂĂꍇ̂݃f[^쐬
	if( !IsLoadFile ){
		//nCXRAf[^쐬
		CreateHiScoreDataArea();
		
		//Xyf[^쐬
		CreateSpellDataArea();
		
		//vCf[^쐬
		CreatePlayDataArea();
		
		//RtBOf[^쐬
		CreateConfigDataArea();
	}
}

/**
 * ʃf[^Ԃ폜
 */
function DeleteOFTCommonData(){
	//ʏGA
	ClearCommonDataEx( "OFT" );
	
	//Z[upGA
	ClearCommonDataEx( "OFT_Save" );
	
	//RtBOpGA
	ClearCommonDataEx( "OFT_Config" );
	
	//ꎞgpGA
	ClearCommonDataEx( "OFT_tmp" );
}

/**
 * ʃf[^ԂZ[u
 */
function SaveOFTCommonData(){
	if( !isReplayData ){
		//Z[ut@Cɕۑ
		SaveCommonDataEx( "OFT_Save", SaveFilePath );
		//vCt@Cɕۑ
		//SaveCommonDataInReplayFileEx( "OFT_Save" );
		//SaveCommonDataInReplayFile();
		
		//RtBOۑ
		SaveCommonDataEx( "OFT_Config", ConfigFilePath );
	}else{
		//vCĐ͉Ȃ
	}
}


/**
 * BGM̒~EĐs
 * 
 * @param {String} prevBGM ~BGM̃t@CpX
 * @param {String} nextBGM ĐBGM̃t@CpX
 */
task ChangeBGM( prevBGM, nextBGM ){
	FadeOutMusic( prevBGM, 20 );
	FWait( 90 );
	PlayMusic( nextBGM );
	DeleteMusic( prevBGM );
}

/**
 * Xe[WJn
 * Xe[WԂ̐Ȃǂōs
 * 
 * @param { Integer } difficult Փx
 * @param { Integer } player    vC[
 * @param { Integer } stage     JnXe[W
 */
task StageStart( difficult, player, stage ){
	let playerName = "";
	let difficultName = "";
	
	//^CgBGM~
	ChangeBGM( bgmTitle, "" );
	//Xe[gύX
	State = State_Load;
	
	//vC[ݒ
	alternative( player )
		case( 1 ){
			//Tj[
			playerName = "Sunny";
		}
		case( 2 ){
			//i`
			playerName = "Luna";
		}
		case( 3 ){
			//X^[
			playerName = "Star";
		}
	SetCommonDataEx( "OFT", "Player", playerName );
	
	//Փxݒ
	alternative( difficult )
		case( 1 ){
			//Easy
			difficultName = "Easy";
			ExtendScore = EasyExtendScore;
			SetBombExtendNormaPoint( EasyBombExtendScore );
		}
		case( 2 ){
			//Normal
			difficultName = "Normal";
			ExtendScore = NormalExtendScore;
			SetBombExtendNormaPoint( NormalBombExtendScore );
		}
		case( 3 ){
			//Panic
			difficultName = "Panic";
			ExtendScore = PanicExtendScore;
			SetBombExtendNormaPoint( PanicBombExtendScore );
		}
	SetCommonDataEx( "OFT", "Difficult", difficultName );
	
	//2b炢҂Ă݂
	FWait( 120 );
	
	//Xe[Wݒ
	if( stage == 0 ){
		//{
		
		//Xe[W1
		AddStagePlayNum( playerName, difficultName, "1" );
		Stage1();
		FWait( 240 );
/*		
		//Xe[W2
		AddStagePlayNum( playerName, difficultName, "2" );
		Stage2();
		FWait( 240 );
		
		//Xe[W3
		AddStagePlayNum( playerName, difficultName, "3" );
		Stage3();
		FWait( 240 );
		
		//Xe[WEX
		let isContinue  = Continued();
		let MissNum     = GetMissCount();
		let BombNum     = GetBombCount();
		let GetSpellNum = GetCommonDataDefaultEx( "OFT", "GetSpellNum", 0 );
		//Xe[WEX˓
		//  m[ReBj[
		//  ~X+{ <= 6
		//  Xy擾 >= 10
		if( !isContinue && (MissNum + BombNum) <= 6 && GetSpellNum >= 10 ){
			AddStagePlayNum( playerName, difficultName, "4" );
			StageEX();
			FWait( 240 );
		}
*/		
		//NA񐔃vX
		AddClearNum( playerName, difficultName, !Continued() );
		
		//Xe[WI
		ClearStage();
	}else{
		//vNeBX
		alternative( stage )
			case( 1 ){
				//1
				AddStagePlayNum( playerName, difficultName, "1" );
				Stage1();
			}
			case( 2 ){
				//2
				AddStagePlayNum( playerName, difficultName, "2" );
				Stage2();
			}
			case( 3 ){
				//3
				AddStagePlayNum( playerName, difficultName, "3" );
				Stage3();
			}
			case( 4 ){
				//Ex
				AddStagePlayNum( playerName, difficultName, "4" );
				StageEX();
			}
		
		//1b҂
		FWait(60);
		
		//Xe[WI
		ClearStage();
	}
}

/**
 * Z[uRtBOf[^̍폜s
 */
task ClearSaveData(){
	if( isReplayData ){
		//vCĐŏ̂͂܂
		ClearStage();
	}else{
		//ݒ
		IsLoadFile = false;
		//lݒ
		CreateOFTCommonData();
		//lŃZ[u
		SaveOFTCommonData();
		//b菈u
		ClearStage();
	}
}

/**
 * XRAGNXeh̏s
 */
task ScoreExtend(){
	//lݒ肳܂őҋ@
	while( ExtendScore == 0 ){
		yield;
	}
	
	let extendscore = ExtendScore;
	let ccount = GetAllowedContinueCount();
	let contnum = 0;
	let handredmillionscore = 0;
	
	loop{
		while( ccount == GetAllowedContinueCount() ){
			handredmillionscore = score1 * ( scoreexp / 10 ) + truncate(score2 / 10);
			if( handredmillionscore > extendscore ){
				CreateUserItem( GetPlayerX(), GetPlayerY(), UI_LIFE );
				extendscore += ExtendScore;
			}
			
			yield;
		}
		
		//ReBj[
		ccount = GetAllowedContinueCount();
		//GNXehl
		extendscore = ExtendScore;
		contnum += 1;
		//XRA
		score1 = 0;
		score2 = 0;
		score3 = contnum;
		//XRAl
		SubScorePoint( GetScorePoint() - 1 );
	}
}

/**
 * ݓ_p̃OCYǗ^XN
 */
task GrazeTask(){
	let graze = 0;
	
	loop{
		graze = truncate( GetScorePoint() / 10 ) * 40;
		AddGraze( graze - GetGraze() );
		
		yield;
	}
}

/**
 * I[o[GNXeh^XN
 */
task OverExtend(){
	let playernum = 0;
	let bombnum = 0;
	let playermaxnum = 10;
	let bombmaxnum = 10;
	
	loop{
		playernum = GetPlayerLife();
		bombnum = GetPlayerBomb();
		//c@I[o[GNXeh
		if( playernum > playermaxnum ){
			playernum -= playermaxnum;
			AddScore( OverPlayerExtendBonus * playernum );
			ExtendPlayer( -playernum );
		}
		//{I[o[GNXeh
		if( bombnum > bombmaxnum ){
			bombnum -= bombmaxnum;
			AddScore( OverBombExtendBonus * bombnum );
			AddBomb( -bombnum );
		}
		
		yield;
	}
}

/**
 * XRAlǗ^XN
 */
task ScorePointControlTask(){
	let misscount = 0;
	let bombcount = 0;
	let scorepoint = 0;
	let subscorepoint = 0;
	
	loop{
		//fXyieB
		if( misscount != GetMissCount() ){
			scorepoint = GetScorePoint();
			subscorepoint = truncate( scorepoint * 0.15 );
			SubScorePoint( subscorepoint );
			
			misscount = GetMissCount();
		}
		//{yieB
		if( bombcount != GetBombCount() ){
			scorepoint = GetScorePoint();
			subscorepoint = truncate( scorepoint * 0.03 );
			SubScorePoint( subscorepoint );
			
			bombcount = GetBombCount();
		}
		
		yield;
	}
}